home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / hugearr.zip / SJSGREAL.C < prev    next >
C/C++ Source or Header  |  1992-04-02  |  2KB  |  75 lines

  1.  
  2. #define NOCOMM
  3. #include <windows.h>
  4. #include <memory.h>
  5.  
  6. #include "sjslib.h"
  7.  
  8. /* Similar to Window's GlobalReAlloc, except if GlobalReAlloc fails,
  9.    this function will attempt to simulate it using GlobalAlloc and fmemcpy. */
  10. /* VBM: Declare Function SjsGlobalReAlloc% Lib "sjslib.dll" Alias "SjsGlobalReAlloc" (ByVal hMem%, ByVal dwBytes&, ByVal wFlags%) */
  11. HANDLE FAR PASCAL
  12. SjsGlobalReAlloc(HANDLE hOldMem, DWORD dwBytes, WORD wFlags)
  13.     {
  14.     HANDLE hNewMem;
  15.     DWORD  dwOldSize;
  16.     HPBYTE hpbOld;
  17.     HPBYTE hpbNew;
  18.     WORD   wCopyBytes;
  19.     DWORD  dwNumBlocks;
  20.  
  21.     /* Attempt to use Windows function for reallocation. */
  22.     if ((hNewMem = GlobalReAlloc(hOldMem, dwBytes, wFlags)) != NULL)
  23.         return hNewMem;
  24.  
  25.     /* Attempt to create new block of memory. */
  26.     if ((hNewMem = GlobalAlloc(wFlags, dwBytes)) == NULL)
  27.         return NULL;
  28.  
  29.     /* Get size of original block. */
  30.     dwOldSize = GlobalSize(hOldMem);
  31.     /* Only copy up to the smaller of the two block sizes. */
  32.     if (dwBytes < dwOldSize)
  33.         dwOldSize = dwBytes;
  34.  
  35.     /* Lock old block. */
  36.     if ((hpbOld = GlobalLock(hOldMem)) == NULL)
  37.         {
  38.         /* Free new block; old handle remains valid. */
  39.         GlobalFree(hNewMem);
  40.         return NULL;
  41.         }
  42.  
  43.     /* Lock new block. */
  44.     if ((hpbNew = GlobalLock(hNewMem)) == NULL)
  45.         {
  46.         /* Unlock old block, free new block; old handle remains valid. */
  47.         GlobalUnlock(hOldMem);
  48.         GlobalFree(hNewMem);
  49.         return NULL;
  50.         }
  51.  
  52.     /* Copy half of a segment at one time. */
  53.     wCopyBytes = (WORD) (dwSEGSIZE / 2UL);
  54.     /* Copy up through the last full segment. */
  55.     dwNumBlocks = (dwOldSize / dwSEGSIZE) * 2UL;
  56.  
  57.     while (dwNumBlocks-- > 0)
  58.         {
  59.         _fmemcpy(hpbNew, hpbOld, (size_t) wCopyBytes);
  60.         hpbNew += wCopyBytes;
  61.         hpbOld += wCopyBytes;
  62.         wCopyBytes = (WORD) (dwSEGSIZE - wCopyBytes);
  63.         }
  64.  
  65.     /* Copy part of last segment used. */
  66.     if ((wCopyBytes = (WORD) (dwOldSize % dwSEGSIZE)) > 0)
  67.         _fmemcpy(hpbNew, hpbOld, (size_t) wCopyBytes);
  68.  
  69.     /* Unlock the new block; unlock and free the old one. */
  70.     GlobalUnlock(hNewMem);
  71.     GlobalUnlock(hOldMem);
  72.     GlobalFree(hOldMem);
  73.     return hNewMem;
  74.     }
  75.